package com.cloud.base.service.impl;

import cn.hutool.core.util.IdUtil;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.cloud.base.config.OssConfig;
import com.cloud.base.domain.dto.OssTokenDto;
import com.cloud.base.service.IOssService;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
@Service("ossService")
public class OssServiceImpl implements IOssService {
    @Resource
    private OssConfig ossConfig;
    public OssTokenDto getOssTempToken() {
        String endpoint = ossConfig.getEndpoint();
        // 填写步骤1生成的访问密钥AccessKey ID和AccessKey Secret。
        String AccessKeyId = ossConfig.getAccessKeyId();
        String accessKeySecret = ossConfig.getAccessKeySecret();
        // 填写步骤3获取的角色ARN。
        String roleArn = ossConfig.getRoleArn();
        // 自定义角色会话名称，用来区分不同的令牌，例如可填写为SessionTest。
        String roleSessionName = IdUtil.getSnowflakeNextIdStr();
        // 以下Policy用于限制仅允许使用临时访问凭证向目标存储空间examplebucket上传文件。
        // 临时访问凭证最后获得的权限是步骤4设置的角色权限和该Policy设置权限的交集，即仅允许将文件上传至目标存储空间examplebucket下的exampledir目录。

        String policyText = "{\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"oss:PutObject\"], \"Resource\": [\"acs:oss:*:*:"+ossConfig.getBucketName()+"/*\"]}], \"Version\": \"1\"}";
        try {
            // regionId表示RAM的地域ID。以华东1（杭州）地域为例，regionID填写为cn-hangzhou。也可以保留默认值，默认值为空字符串（""）。
            String regionId = ossConfig.getRegionId();
            // 添加endpoint。适用于Java SDK 3.12.0及以上版本。
            DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
            // 添加endpoint。适用于Java SDK 3.12.0以下版本。
            // DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
            // 构造default profile。
            IClientProfile profile = DefaultProfile.getProfile(regionId, AccessKeyId, accessKeySecret);

            // 构造client。
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            // 适用于Java SDK 3.12.0及以上版本。
            request.setSysMethod(MethodType.POST);
            // 适用于Java SDK 3.12.0以下版本。
            //request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            request.setPolicy(policyText); // 如果policy为空，则用户将获得该角色下所有权限。
            request.setDurationSeconds(3600L); // 设置临时访问凭证的有效时间为3600秒。
            final AssumeRoleResponse response = client.getAcsResponse(request);
            OssTokenDto tokenDto = new OssTokenDto();
            tokenDto.setEndpoint(ossConfig.getEndpoint2());
            tokenDto.setSecurityToken(response.getCredentials().getSecurityToken());
            tokenDto.setAccessKeyId(response.getCredentials().getAccessKeyId());
            tokenDto.setAccessKeySecret(response.getCredentials().getAccessKeySecret());
            tokenDto.setExpiration(response.getCredentials().getExpiration());
            tokenDto.setBucket(ossConfig.getBucketName());
            tokenDto.setPolicyText(policyText);
          /*  Base64.Encoder encoder= Base64.getEncoder();
            encoder.encodeToString(policyText.getBytes());*/
            return tokenDto;
        } catch (RuntimeException e) {
            throw new RuntimeException(e.getMessage());
        } catch (com.aliyuncs.exceptions.ClientException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}
